﻿#ifndef INTERFACEMANAGER_H
#define INTERFACEMANAGER_H

/******************************************************************************
 * Copyright (c) 2025 ROKAE (Beijing) Technology Co., Ltd. All Rights Reserved.
 *
 * Information in this file is the intellectual property of Rokae Technology Co., Ltd,
 * And may contains trade secrets that must be stored and viewed confidentially.
 *
 * @ file interfacemanager.h
 * @ brief Plugin interface management！
 * @ version 1.0.0
 * @ author ROKAE Development Team
 *****************************************************************************/

#include <QObject>
#include "plugincommon.h"
#include "xplugin_global.h"
#include <functional>

namespace xplugin {
struct PhysicalButton{
    QString text;
    QString touched_icon;
    QString untouched_icon;
    std::function<void (bool is_pressed)> exec_function;
};

class XPLUGIN_EXPORT InterfaceManager : public QObject
{
    Q_OBJECT

public:
    explicit InterfaceManager(QObject *parnet = nullptr);
    ~InterfaceManager() {}

    // 通用数据接口 自定义插件和控制器插件通信协议
    // QJsonArray[PluginName:{key:value}...]
    QJsonArray commandCustomData(QObject *obj, const QString &pluginName, const QString &key);
    QJsonArray commandCustomData(QObject *obj, const QString &pluginName, const QString &key, const QString &val);
    QJsonArray commandCustomData(QObject *obj, const QString &pluginName, const QJsonObject& json);
    QJsonArray commandCustomData(QObject *obj, const QJsonObject& json);
    QJsonArray commandCustomData(QObject *obj, const QJsonArray& arr);

    // 通用数据接口 获取数据
    QJsonValue getNodeData(const QString &key);

    /********************************HMI与控制器配置相关*******************************************/
    // 获取网络状态
    bool getRobotConnected();

    // 获取机器人的ID
    QString getRobotID();

    // 获取机器人状态
    QString getRobotPhyStatus();

    // 获取当前用户权限级别
    int getUserOperateLevel();
    /*********************************运动指令********************************************/


    /*********************************HMI数据********************************************/

    // 获取当前工具
    QString getCurTool();

    // 获取当前工件
    QString getCurWobj();

    // 获取工具列表
    QStringList getToolList();

    // 获取工件列表
    QStringList getWobjList();

    // 获取速度列表
    QStringList getSpeedList();
    // 获取转弯区列表
    QStringList getZoneList();

    // 由变量类型获取变量名称列表
    QStringList getVarDataList(const QString &type = "");

    // 由变量类型和值创建基本变量
    bool addVarData(const QString &name, QVariant value);

    // 由变量类型和值创建基本变量
    bool delVarData(const QString &name);

    bool updateVarData(const QString &name, QVariant value);

    // 获取变量的结构
    QJsonObject getVarObjDataByName(const QString &name);

    // 获取点位名称列表
    QStringList getPointNameList();
    // 获取点位结构数据
    QJsonObject getPointObjDataByName(const QString &pointName);
    // 获取点位数据
    QVector<double> getPointDataByName(const QString &pointName);
    // 由当前点新建笛卡尔点位变量
    bool addCurrentCartPoint(const QString& pointName, const QString& toolName, const QString& wobjName);

    // 获取工程列表
    QStringList getProjectList();
    // 创建一个默认工程
    int createProject(const QString& projectName, const QString& robot = "", const QString &desc = "", bool isUsed = false);
    // 切换工程
    int changeProject(const QString& projectName, const QString& robot = "");
    // 删除工程
    int removeProject(const QString& projectName, const QString& robot = "");

    // 点位可达性校验
    int checkPointMoveTo(const QString &pointFrom, const QString &pointTo);
    // 点位一致性校验
    int checkPointSame(const QString &pointFrom, const QString &pointTo);

    // 运动至
    void moveToStart(int &errCode, const QString &pointNameTo, int speed, bool isMoveJ);
    void moveToStart(int &errCode, const QString &pointNameTo, int speed, bool confCheck, bool isMoveJ);
    void moveToStart(int &errCode, double x, double y, double z, int speed, bool isMoveJ);
    void moveToStop();

    // 修改笛卡尔下的点位值
    void changeCartPoint(const QString& pointName, const QVector<double>& xyz_abc);

    // 获取所有的IO名称列表以及值
    QHash<QString, bool> getIOHash();

    // 获取所有的寄存器名称列表以及值
    QHash<QString, QStringList> getRegisterHash();

    // 注册机制
private:
};

// 数据获取入口
InterfaceManager XPLUGIN_EXPORT  &xPluginInterface();

// 创建中心窗体
int XPLUGIN_EXPORT CreateCenterWidget(const QString &pluginName, QWidget *widget);
// 创建状态栏
int XPLUGIN_EXPORT CreateStatusBar(const QString &pluginName, QWidget *widget, int index = 1);
// 创建物理按键
int XPLUGIN_EXPORT CreatePhyButtonList(const QString &pluginName, const QString& type, const QList<PhysicalButton>& left_buttons,
                                       const QList<PhysicalButton>& right_buttons, QStringList center_texts = QStringList(""));
// 启用/关闭物理按键
int XPLUGIN_EXPORT ChangePhyButtonStatus(const QString &pluginName, const QString& type, bool enable);

// 注册语言包
int XPLUGIN_EXPORT RegistLanguage(const QString &pluginName, enLanguage type, const QString &qmPath);
}

#endif // INTERFACEMANAGER_H
